package io.github.echarts.option.series;

import java.util.List;
import java.util.ArrayList;

import io.github.echarts.option.style.ItemStyle;
import io.github.echarts.option.style.LabelStyle;

/**
 * 饼图系列配置类
 */
public class PieSeries extends SeriesOption {
    private List<Object> center;  // 圆心坐标，默认为['50%', '50%']
    private Object radius;  // 半径，可以是数值或百分比，也可以是数组表示内外半径
    private Boolean clockwise = true;  // 是否顺时针排布
    private Double startAngle = 90.0;  // 起始角度，默认为90度(12点钟方向)
    private Double minAngle = 0.0;  // 最小扇区角度，小于这个角度的扇区将被合并
    private String roseType;  // 是否展示成南丁格尔图，可选值：'radius', 'area'
    private Double selectedOffset = 10.0;  // 选中扇区的偏移距离
    private Boolean avoidLabelOverlap = true;  // 是否启用防止标签重叠策略
    private LabelStyle label;  // 标签配置
    private ItemStyle itemStyle;  // 扇区样式配置
    private List<PieDataItem> pieData = new ArrayList<>();  // 数据项列表

    public PieSeries() {
        super();
        this.setType("pie");
        this.center = new ArrayList<>();
        this.center.add("50%");
        this.center.add("50%");
        this.radius = "75%";  // 默认半径为画布的75%
    }

    /**
     * 设置饼图的中心坐标
     * @param centerX 中心x坐标，可以是数值或百分比
     * @param centerY 中心y坐标，可以是数值或百分比
     * @return 当前实例
     */
    public PieSeries setCenter(Object centerX, Object centerY) {
        this.center = new ArrayList<>();
        this.center.add(centerX);
        this.center.add(centerY);
        return this;
    }

    /**
     * 设置饼图的半径
     * @param radius 半径值，可以是数值或百分比
     * @return 当前实例
     */
    public PieSeries setRadius(Object radius) {
        this.radius = radius;
        return this;
    }

    /**
     * 设置饼图的内外半径
     * @param innerRadius 内半径，可以是数值或百分比
     * @param outerRadius 外半径，可以是数值或百分比
     * @return 当前实例
     */
    public PieSeries setRadius(Object innerRadius, Object outerRadius) {
        List<Object> radiusList = new ArrayList<>();
        radiusList.add(innerRadius);
        radiusList.add(outerRadius);
        this.radius = radiusList;
        return this;
    }

    /**
     * 设置是否顺时针排布
     * @param clockwise 顺时针排布
     * @return 当前实例
     */
    public PieSeries setClockwise(Boolean clockwise) {
        this.clockwise = clockwise;
        return this;
    }

    /**
     * 设置起始角度
     * @param startAngle 起始角度，单位度
     * @return 当前实例
     */
    public PieSeries setStartAngle(Double startAngle) {
        this.startAngle = startAngle;
        return this;
    }

    /**
     * 设置最小扇区角度
     * @param minAngle 最小角度，单位度
     * @return 当前实例
     */
    public PieSeries setMinAngle(Double minAngle) {
        this.minAngle = minAngle;
        return this;
    }

    /**
     * 设置南丁格尔图类型
     * @param roseType 南丁格尔图类型，可选值：'radius', 'area'
     * @return 当前实例
     */
    public PieSeries setRoseType(String roseType) {
        this.roseType = roseType;
        return this;
    }

    /**
     * 设置选中扇区的偏移距离
     * @param selectedOffset 偏移距离
     * @return 当前实例
     */
    public PieSeries setSelectedOffset(Double selectedOffset) {
        this.selectedOffset = selectedOffset;
        return this;
    }

    /**
     * 设置是否启用防止标签重叠
     * @param avoidLabelOverlap 是否启用
     * @return 当前实例
     */
    public PieSeries setAvoidLabelOverlap(Boolean avoidLabelOverlap) {
        this.avoidLabelOverlap = avoidLabelOverlap;
        return this;
    }

    /**
     * 设置标签样式
     * @param label 标签样式
     * @return 当前实例
     */
    public PieSeries setLabel(LabelStyle label) {
        this.label = label;
        return this;
    }

    /**
     * 设置扇区样式
     * @param itemStyle 扇区样式
     * @return 当前实例
     */
    public PieSeries setItemStyle(ItemStyle itemStyle) {
        this.itemStyle = itemStyle;
        return this;
    }

    /**
     * 添加数据项
     * @param name 名称
     * @param value 值
     * @return 当前实例
     */
    public PieSeries addData(String name, Number value) {
        PieDataItem dataItem = new PieDataItem(name, value);
        this.pieData.add(dataItem);
        // 更新基类的data数组
        updateData();
        return this;
    }

    /**
     * 添加数据项
     * @param dataItem 数据项
     * @return 当前实例
     */
    public PieSeries addData(PieDataItem dataItem) {
        this.pieData.add(dataItem);
        // 更新基类的data数组
        updateData();
        return this;
    }

    /**
     * 更新基类的data数组，确保兼容性
     */
    private void updateData() {
        Object[] dataArray = new Object[this.pieData.size()];
        for (int i = 0; i < this.pieData.size(); i++) {
            PieDataItem item = this.pieData.get(i);
            dataArray[i] = item;
        }
        super.setData(dataArray);
    }

    /**
     * 获取饼图特定的数据列表
     * @return 饼图数据列表
     */
    public List<PieDataItem> getPieData() {
        return pieData;
    }

    // 重写父类方法，确保兼容性
    @Override
    public Object getData() {
        return super.getData();
    }
    
    // 重写父类方法，确保兼容性
    @Override
    public PieSeries setData(Object data) {
        super.setData(data);
        return this;
    }

    // Getters
    public List<Object> getCenter() {
        return center;
    }

    public Object getRadius() {
        return radius;
    }

    public Boolean getClockwise() {
        return clockwise;
    }

    public Double getStartAngle() {
        return startAngle;
    }

    public Double getMinAngle() {
        return minAngle;
    }

    public String getRoseType() {
        return roseType;
    }

    public Double getSelectedOffset() {
        return selectedOffset;
    }

    public Boolean getAvoidLabelOverlap() {
        return avoidLabelOverlap;
    }

    public LabelStyle getLabel() {
        return label;
    }

    public ItemStyle getItemStyle() {
        return itemStyle;
    }

    /**
     * 饼图数据项类
     */
    public static class PieDataItem {
        private String name;
        private Number value;
        private ItemStyle itemStyle;
        private LabelStyle label;
        private Boolean selected = false;

        public PieDataItem(String name, Number value) {
            this.name = name;
            this.value = value;
        }

        // Setters with builder pattern
        public PieDataItem setItemStyle(ItemStyle itemStyle) {
            this.itemStyle = itemStyle;
            return this;
        }

        public PieDataItem setLabel(LabelStyle label) {
            this.label = label;
            return this;
        }

        public PieDataItem setSelected(Boolean selected) {
            this.selected = selected;
            return this;
        }

        // Getters
        public String getName() {
            return name;
        }

        public Number getValue() {
            return value;
        }

        public ItemStyle getItemStyle() {
            return itemStyle;
        }

        public LabelStyle getLabel() {
            return label;
        }

        public Boolean getSelected() {
            return selected;
        }
    }
} 